"""
SteHub 配置管理模块
支持本地模式和云端模式
"""
import os
import secrets
from datetime import timedelta

class Config:
    """基础配置类"""
    
    # 基础配置
    SECRET_KEY = os.environ.get('SECRET_KEY') or secrets.token_hex(32)
    RUN_MODE = os.environ.get('RUN_MODE', 'local')  # local 或 cloud
    
    # 数据库配置
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
    if not SQLALCHEMY_DATABASE_URI:
        if RUN_MODE == 'local':
            SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'
        else:
            SQLALCHEMY_DATABASE_URI = 'postgresql://localhost/stehub'
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_recycle': 300,
        'pool_pre_ping': True
    }
    
    # 文件上传配置
    MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 16 * 1024 * 1024))  # 16MB
    UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', 'instance/uploads')
    ALLOWED_EXTENSIONS = {
        'images': {'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'},
        'documents': {'pdf', 'doc', 'docx', 'txt', 'md'},
        'archives': {'zip', 'rar', '7z'},
        'code': {'py', 'js', 'html', 'css', 'java', 'cpp', 'c'}
    }
    
    # JWT配置
    JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY') or secrets.token_hex(32)
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=24)
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)
    JWT_TOKEN_LOCATION = ['headers', 'cookies']
    JWT_COOKIE_SECURE = False  # 生产环境应为True
    JWT_COOKIE_CSRF_PROTECT = True
    
    # 安全配置
    BCRYPT_LOG_ROUNDS = int(os.environ.get('BCRYPT_LOG_ROUNDS', 12))
    WTF_CSRF_ENABLED = True
    
    # 会话配置
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = 'Lax'
    
    # 邮件配置（可选）
    MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.gmail.com')
    MAIL_PORT = int(os.environ.get('MAIL_PORT', 587))
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() == 'true'
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    MAIL_DEFAULT_SENDER = os.environ.get('MAIL_DEFAULT_SENDER', 'noreply@stehub.com')
    
    # 存储配置
    if RUN_MODE == 'cloud':
        # 云存储配置
        CLOUD_STORAGE_PROVIDER = os.environ.get('CLOUD_STORAGE_PROVIDER', 'aws_s3')
        AWS_ACCESS_KEY = os.environ.get('AWS_ACCESS_KEY')
        AWS_SECRET_KEY = os.environ.get('AWS_SECRET_KEY')
        S3_BUCKET = os.environ.get('S3_BUCKET')
        S3_REGION = os.environ.get('S3_REGION', 'us-east-1')
    else:
        # 本地存储配置
        CLOUD_STORAGE_PROVIDER = None
    
    # Socket.IO 配置
    SOCKETIO_ASYNC_MODE = 'eventlet'
    SOCKETIO_CORS_ALLOWED_ORIGINS = "*"
    
    # 缓存配置
    CACHE_TYPE = 'simple'
    CACHE_DEFAULT_TIMEOUT = 300
    
    # 管理员配置
    ADMIN_USERNAMES = os.environ.get('ADMIN_USERNAMES', 'admin,administrator').split(',')

class DevelopmentConfig(Config):
    """开发环境配置"""
    
    DEBUG = True
    TESTING = False
    
    # 开发环境数据库
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///dev.db'
    
    # 开发环境安全配置
    WTF_CSRF_ENABLED = False
    JWT_COOKIE_SECURE = False
    
    # 开发环境日志级别
    LOG_LEVEL = 'DEBUG'

class TestingConfig(Config):
    """测试环境配置"""
    
    DEBUG = False
    TESTING = True
    
    # 测试数据库
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or 'sqlite:///:memory:'
    
    # 测试安全配置
    WTF_CSRF_ENABLED = False
    JWT_COOKIE_SECURE = False
    
    # 测试密钥
    SECRET_KEY = 'test-secret-key'
    JWT_SECRET_KEY = 'test-jwt-secret-key'
    
    # 测试BCrypt轮次（降低复杂度加速测试）
    BCRYPT_LOG_ROUNDS = 4

class ProductionConfig(Config):
    """生产环境配置"""
    
    DEBUG = False
    TESTING = False
    
    # 生产环境安全配置
    WTF_CSRF_ENABLED = True
    JWT_COOKIE_SECURE = True
    SESSION_COOKIE_SECURE = True
    
    # 生产环境日志级别
    LOG_LEVEL = 'INFO'
    
    # 生产环境数据库
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL')
    if not SQLALCHEMY_DATABASE_URI:
        raise ValueError("生产环境必须设置 DATABASE_URL 环境变量")
    
    # 生产环境必须设置密钥
    if not os.environ.get('SECRET_KEY'):
        raise ValueError("生产环境必须设置 SECRET_KEY 环境变量")

# 配置映射
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}

def get_config():
    """获取当前环境配置"""
    env = os.environ.get('FLASK_ENV', 'development')
    return config.get(env, config['default'])